<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>926. 将字符串翻转到单调递增</title>
  </head>
  <body>
    <script>
      //     如果一个二进制字符串，是以一些 0（可能没有 0）后面跟着一些 1（也可能没有 1）的形式组成的，那么该字符串是 单调递增 的。

      // 给你一个二进制字符串 s，你可以将任何 0 翻转为 1 或者将 1 翻转为 0 。

      // 返回使 s 单调递增的最小翻转次数。

      //

      // 示例 1：

      // 输入：s = "00110"
      // 输出：1
      // 解释：翻转最后一位得到 00111.
      // 示例 2：

      // 输入：s = "010110"
      // 输出：2
      // 解释：翻转得到 011111，或者是 000111。
      // 示例 3：

      // 输入：s = "00011000"
      // 输出：2
      // 解释：翻转得到 00000000。

      // 来源：力扣（LeetCode）
      // 链接：https://leetcode.cn/problems/flip-string-to-monotone-increasing
      // 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

      /**
       * @param {string} s
       * @return {number}
       */
      var minFlipsMonoIncr = function (s) {
        const arr0 = []
        const arr1 = []
        for (let i = 0; i < s.length; i++) {
          if (s[i] === '0') {
            arr0.push(i) // 存储字符为 0 的索引值
          } else {
            arr1.push(i) // 存储字符为 1 的索引值
          }
        }
        let str = s.slice(arr1[0], arr0[arr0.length - 1] + 1)

        let res = 0,
          one = 0
        for (let i of str) {
          if (i === '1') {
            one++
          } else {
            res = Math.min(res + 1, one)
          }
        }
        return res
        // let do0 = 0 // 记录反转为 0 的次数
        // let m = 0
        // while (arr0[arr0.length - 1] > arr1[m]) {
        //   // 判断有多少个 1 的索引值在 0 区间里的
        //   do0++
        //   m++
        // }
        // let do1 = 0 // 记录反转为 1 的次数
        // m = arr0.length - 1
        // while (arr1[0] < arr0[m]) {
        //   // 判断有多少个 0 的索引值在 1 区间里的
        //   do1++
        //   m--
        // }
        // console.log('do0', do0, 'do1', do1)
        // return Math.min(do0, do1) // 取最小值
      }

      // var minFlipsMonoIncr = function (s) {
      //   const n = s.length
      //   let dp0 = 0,
      //     dp1 = 0
      //   for (let i = 0; i < n; i++) {
      //     const c = s[i]
      //     let dp0New = dp0,
      //       dp1New = Math.min(dp0, dp1)
      //     if (c === '1') {
      //       dp0New++
      //     } else {
      //       dp1New++
      //     }
      //     dp0 = dp0New
      //     dp1 = dp1New
      //   }
      //   return Math.min(dp0, dp1)
      // }

      console.log(minFlipsMonoIncr('10011101'))
    </script>
  </body>
</html>
